package com.cn.shiro_demo.controller;


import com.cn.shiro_demo.model.Role;
import com.cn.shiro_demo.model.User;
import com.cn.shiro_demo.service.UserService;
import lombok.extern.log4j.Log4j2;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Log4j2
@Controller
public class LoginController {

    @Autowired
    UserService service;

    @RequestMapping(method = RequestMethod.GET, path = {"/", "/index"})
    public String index() {
        return "login";
    }

    /**
     * @Description:TODO 普通登录方式
     * @param:
     * @return:
     * @throws Exception
     */
//    @PostMapping("login")
//    @ResponseBody
//    public String login(@RequestParam String username, @RequestParam String password) {
//        Boolean login = service.login(username, password);
//        if (login) {
//            return "登录成功";
//        } else {
//            return "登录失败";
//        }
//    }

    /**
     * @throws Exception
     * @Description:TODO shiro登陆方式
     * @param: [username, password]
     * @return: java.lang.String
     */
    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        log.info("用户名：{}，密码：{}", username, password);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        log.info("token:{}", token);
        try {
            subject.login(token);
            log.info("当前用户已登录");
            User user = (User) subject.getPrincipal();
            List<Role> roles = service.findRolesByUserId(user.getId());
            ArrayList<String> list = new ArrayList<>();
            for (Role role : roles) {
                list.add(role.getName());
            }
            if (list.contains("svip")) {
                return "svipHome";
            } else if (list.contains("vvip")) {
                return "vvipHome";
            } else if (list.contains("vip")) {
                return "vipHome";
            } else {
                return "home";
            }
        } catch (UnknownAccountException e) {
            log.error("用户名不存在！", e);
            return "用户名不存在！";
        } catch (AuthenticationException e) {
            log.error("账号或密码错误！", e);
            return "账号或密码错误！";
        } catch (AuthorizationException e) {
            log.error("没有权限！", e);
            return "没有权限";
        }
    }

    /**
     * @throws Exception
     * @Description:TODO shiro 用户退出登录
     * @param: []
     * @return: java.lang.String
     */
    @GetMapping("/logout")
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        log.info("当前用户已退出");
        return "login";
    }


    /**
     * @RequiresAuthentication： 标识方法需要登录才能访问。
     * @RequiresGuest： 标识方法允许匿名访问。
     * @RequiresPermissions： 标识方法需要具有指定的权限才能访问。
     * @RequiresRoles： 标识方法需要具有指定的角色才能访问。
     * @RequiresUser： 标识方法需要用户登录才能访问。
     */

    @RequiresRoles("svip")
    @GetMapping("/sviphome")
    public String svipHome() {
        return "svipHome";
    }

    @RequiresRoles("vip")
    @GetMapping("/viphome")
    public String vipHome() {
        return "vipHome";
    }


    @RequiresPermissions("c")
    @GetMapping("/add")
    @ResponseBody
    public String add() {
        try {
            return "add-已新增";
        } catch (AuthenticationException e) {
            log.error("没有权限！", e);
            return "没有权限";
        }
    }

    @RequiresPermissions("d")
    @GetMapping("/del")
    @ResponseBody
    public String del() {
        try {
            return "del-已删除";
        } catch (AuthenticationException e) {
            log.error("没有权限！", e);
            return "没有权限";
        }
    }

    @RequiresPermissions("u")
    @GetMapping("/update")
    @ResponseBody
    public String update() {
        try {
            return "update-已修改";
        } catch (AuthenticationException e) {
            log.error("没有权限！", e);
            return "没有权限";
        }
    }

    @RequiresPermissions("r")
    @GetMapping("/query")
    @ResponseBody
    public String query() {
        try {
            return "query-已查询";
        } catch (AuthenticationException e) {
            log.error("没有权限！", e);
            return "没有权限";
        }
    }
}
